home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJTST200.ZIP / tests / libc / ansi / math / elefunt / texp10.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  6.2 KB  |  260 lines

  1. /* -*-C-*- derived from texp.c */
  2.  
  3. #include "elefunt.h"
  4.  
  5. /*
  6. float EXP(float);
  7.  
  8. float EXP(float x)
  9. {
  10.     if (x < 0.0)
  11.         return(1.0/exp(-x));
  12.     return(exp(x));
  13. }
  14. */
  15.  
  16. /***********************************************************************
  17. #     program to test exp
  18. #
  19. #     data required
  20. #
  21. #        none
  22. #
  23. #     subprograms required from this package
  24. #
  25. #        machar - an environmental inquiry program providing
  26. #                 information on the floating-point arithmetic
  27. #                 system.  note that the call to machar can
  28. #                 be deleted provided the following four
  29. #                 parameters are assigned the values indicated
  30. #
  31. #                 ibeta - the radix of the floating-point system
  32. #                 it    - the number of base-ibeta digits in the
  33. #                         significand of a floating-point number
  34. #                 xmin  - the smallest non-vanishing floating-point
  35. #                         power of the radix
  36. #                 xmax  - the largest finite floating-point no.
  37. #
  38. #        ran(k) - a function subprogram returning random real
  39. #                 numbers uniformly distributed over (0,1)
  40. #
  41. #
  42. #     standard fortran subprograms required
  43. #
  44. #         abs, aint, alog, AMAX1, exp, float, sqrt
  45. #
  46. #
  47. #     latest revision - december 6, 1979
  48. #
  49. #     author - w. j. cody
  50. #              argonne national laboratory
  51. #
  52. #
  53. ***********************************************************************/
  54.  
  55. void
  56. texp10()
  57. {
  58.     int i,
  59.         ibeta,
  60.         iexp,
  61.         irnd,
  62.         it,
  63.         i1,
  64.         j,
  65.         k1,
  66.         k2,
  67.         k3,
  68.     machep,
  69.         maxexp,
  70.         minexp,
  71.         n,
  72.         negep,
  73.         ngrd;
  74.     float a,
  75.         ait,
  76.         albeta,
  77.         b,
  78.         beta,
  79.         d,
  80.         del,
  81.         eps,
  82.         epsneg,
  83.         r6,
  84.         r7,
  85.     v,
  86.         w,
  87.     x,
  88.         xl,
  89.         xmax,
  90.         xmin,
  91.         xn,
  92.         x1,
  93.     y,
  94.         z,
  95.         zz;
  96.  
  97.     machar(&ibeta, &it, &irnd, &ngrd, &machep, &negep, &iexp, &minexp,
  98.         &maxexp, &eps, &epsneg, &xmin, &xmax);
  99.     beta = (float) ibeta;
  100.     albeta = ALOG(beta);
  101.     ait = (float) it;
  102.     v = 0.0625e0L;
  103.     a = TWO;
  104.     b = log10(a) * 0.5e0L;
  105.     a = -b + v;
  106.     d = log10(0.9e0L * xmax);
  107.     n = 2000;
  108.     xn = (float) n;
  109.     i1 = 0;
  110.  
  111.     /* random argument accuracy tests */
  112.     for (j = 1; j <= 3; ++j)
  113.     {
  114.     k1 = 0;
  115.     k3 = 0;
  116.     x1 = ZERO;
  117.     r6 = ZERO;
  118.     r7 = ZERO;
  119.     del = (b - a) / xn;
  120.     xl = a;
  121.  
  122.     for (i = 1; i <= n; ++i)
  123.     {
  124.         x = del * ran(i1) + xl;
  125.  
  126.         /* purify arguments */
  127.         y = x - v;
  128.         if (y < ZERO)
  129.         x = y + v;
  130.         z = exp10(x);
  131.         zz = exp10(y);
  132.         if (j == 1)
  133.         z = z * exp10(-v);
  134.         else
  135.         {
  136.         if (ibeta != 10)
  137.             /* z = z *.0625e0L - z * 2.4453321046920570389e-3L; */
  138.             z = z * exp10(-2.8125L);
  139.         else
  140.             z = z * 6.0e-2L + z * 5.466789530794296106e-5L;
  141.         }
  142.         w = ONE;
  143.         if (zz != ZERO)
  144.         w = (z - zz) / zz;
  145.         if (w < ZERO)
  146.         k1 = k1 + 1;
  147.         if (w > ZERO)
  148.         k3 = k3 + 1;
  149.         w = ABS(w);
  150.         if (w > r6)
  151.         {
  152.         r6 = w;
  153.         x1 = x;
  154.         }
  155.         r7 = r7 + w * w;
  156.         xl = xl + del;
  157.     }
  158.  
  159.     k2 = n - k3 - k1;
  160.     r7 = sqrt(r7 / xn);
  161.  
  162.     printf("\fTEST OF exp10(X-" F7P4F ") VS exp10(X)/exp10(" F7P4F ")\n\n\n", v, v);
  163.     printf("%7d RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL\n", n);
  164.     printf("      (" F15P4E "," F15P4E ")\n\n\n", a, b);
  165.     printf(" exp10(X-V) WAS LARGER%6d TIMES,\n", k1);
  166.     printf("              AGREED%6d TIMES, AND\n", k2);
  167.     printf("         WAS SMALLER%6d TIMES.\n\n\n", k3);
  168.     printf(
  169. " THERE ARE %4d BASE %4d SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER\n\n\n",
  170.         it, ibeta);
  171.     w = -999.0e0;
  172.     if (r6 != ZERO)
  173.         w = ALOG(ABS(r6)) / albeta;
  174.     printf(" THE MAXIMUM RELATIVE ERROR OF" F15P4E " = %4d **" F7P2F "\n",
  175.         r6, ibeta, w);
  176.     printf("    OCCURRED FOR X =" F17P6E "\n", x1);
  177.     w = AMAX1(ait + w, ZERO);
  178.     printf(
  179.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  180.         ibeta, w);
  181.     w = -999.0e0;
  182.     if (r7 != ZERO)
  183.         w = ALOG(ABS(r7)) / albeta;
  184.     printf(" THE ROOT MEAN SQUARE RELATIVE ERROR WAS" F15P4E " = %4d **" F7P2F "\n",
  185.         r7, ibeta, w);
  186.     w = AMAX1(ait + w, ZERO);
  187.     printf(
  188.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  189.         ibeta, w);
  190.     if (j == 2)
  191.     {
  192.         a = -TWO * a;
  193.         b = TEN * a;
  194.         if (b < d)
  195.         b = d;
  196.     }
  197.     else
  198.     {
  199.         v = 45.0e0L / 16.0e0L;
  200.         a = -TEN * b;
  201.         b = 4.0e0L * xmin * ipow((float) beta, it);
  202.         b = log10(b);
  203.     }
  204.     }
  205.  
  206.     /* special tests */
  207.     printf("\fSPECIAL TESTS\n\n\n");
  208.     printf(" THE IDENTITY exp10(X)*exp10(-X) = 1.0  WILL BE TESTED.\n\n");
  209.     printf("       X        F(X)*F(-X) - 1\n\n");
  210.  
  211.     for (i = 1; i <= 5; ++i)
  212.     {
  213.     x = ran(i1) * beta;
  214.     y = -x;
  215.     z = exp10(x) * exp10(y) - ONE;
  216.     printf(F15P7E F15P7E "\n\n", x, z);
  217.     }
  218.  
  219.     printf("\n\n TEST OF SPECIAL ARGUMENTS\n\n\n");
  220.     x = ZERO;
  221.     y = exp10(x) - ONE;
  222.     printf(" exp10(0.0) - 1.0E0 = " F15P7E "\n\n", y);
  223.     x = AINT(log10(xmin));
  224.     y = exp10(x);
  225.     printf(" exp10(" F13P6E ") =" F13P6E "\n\n", x, y);
  226.     x = AINT(log10(xmax));
  227.     y = exp10(x);
  228.     printf(" exp10(" F13P6E ") =" F13P6E "\n\n", x, y);
  229.     x = x / TWO;
  230.     v = x / TWO;
  231.     y = exp10(x);
  232.     z = exp10(v);
  233.     z = z * z;
  234.     printf(" IF exp10(" F13P6E ") = " F13P6E " IS NOT ABOUT\n", x, y);
  235.     printf(" exp10(" F13P6E ")**2 =" F13P6E " THERE IS AN ARG RED ERROR\n", v, z);
  236.  
  237.     /* test of error returns */
  238.  
  239.     printf("\fTEST OF ERROR RETURNS\n\n\n");
  240.     x = -ONE / sqrt(xmin);
  241.     printf(" exp10 WILL BE CALLED WITH THE ARGUMENT" F15P4E "\n",x);
  242.     printf(" THIS SHOULD TRIGGER AN ERROR MESSAGE\n\n\n");
  243.     fflush(stdout);
  244.     errno = 0;
  245.     y = exp10(x);
  246.     if (errno)
  247.     perror("exp()");
  248.     printf(" exp10 RETURNED THE VALUE" F13P6E "\n\n\n\n", y);
  249.     x = -x;
  250.     printf(" exp10 WILL BE CALLED WITH THE ARGUMENT" F13P6E "\n", x);
  251.     printf(" THIS SHOULD TRIGGER AN ERROR MESSAGE\n\n\n");
  252.     fflush(stdout);
  253.     errno = 0;
  254.     y = exp10(x);
  255.     if (errno)
  256.     perror("exp()");
  257.     printf(" exp10 RETURNED THE VALUE" F13P6E "\n\n\n\n", y);
  258.     printf(" THIS CONCLUDES THE TESTS\n");
  259. }
  260.